//使用定长数组储存元素
#define MAX 10
#include<stdio.h>

typedef int elemtype;
typedef struct SeqList{
    elemtype arr[MAX];   //定长数组
    int size;            //有效数据个数
}SL;

//基本操作

void InitList(SL* sl);
//构造一个空的静态顺序表
/*void DestroyList(SL* sl);*/
//销毁顺序表(静态顺序表基于数组(栈区内存)实现,无需手动销毁)

void ClearList(SL* sl);
//重置顺序表
int ListEmpty(SL* sl);
//判断顺序表是否为空表
int ListLength(SL* sl);
//返回顺序表元素个数
int GetElem(SL* sl, int i, elemtype* x);
//返回第i个元素
int LocateElem(SL* sl, elemtype x);
//返回元素x在表中的位置
int PriorElem(SL* sl, elemtype x, elemtype* e);
//返回元素x的前驱
int NextElem(SL* sl, elemtype x, elemtype* e);
//返回元素x的后继
int ListInsert(SL* sl, int i, elemtype x);
//在i处插入元素x,有效长度加一
int ListDelete(SL* sl, int i);
//删除第i个元素，顺序表长度减一
void TraverseList();
//遍历顺序表

void InitList(SL* sl)
{sl->size = 0;}

void ClearList(SL* sl)
{sl->size = 0;}

int ListEmpty(SL* sl)
{return sl->size == 0;}

int ListLength(SL* sl)
{return sl->size;}

int GetElem(SL* sl, int i, elemtype* x)
{
    if(i < 0 || i > sl->size)
    return 0;//fail
    *x = sl->arr[i - 1];
    return 1;
}

int LocateElem(SL* sl, elemtype x)
{
for(int i = 0; i < sl->size ; i++)
{
    if(x == sl->arr[i])
    return i+1;
}
return 0;//fail
}

int PriorElem(SL* sl, elemtype x, elemtype* e)
{
    int i = LocateElem(sl, x);
    if(i == 1 || i == 0)
    return 0;//fail
    *e = sl->arr[i - 2];
    return 1;
}

int NextElem(SL* sl, elemtype x, elemtype* e)
{
    int i = LocateElem(sl, x);
    if(i == 0 || i == sl->size)
    return 0;//fail
    *e = sl->arr[i];
    return 1;
}

int ListInsert(SL* sl, int i, elemtype x)
{
    //位置错误
    if(i < 0)
    return 0;
    if(i > sl->size + 1)
    return 0;
    //顺序表已满
    if(sl->size == MAX)
    return 0;

    int tem = sl->size;
    while(tem != i - 1)
    {
        sl->arr[tem] = sl->arr[tem - 1];
        tem--;
    }
    sl->arr[tem] = x;
    sl->size++;
    return 1;
}

int ListDelete(SL* sl, int i)
{
    //已空
    if(sl->size == 0)
    return 0;
    //位置错误
    if(i < 0 || i > sl->size)
    return 0;

    int tem = i;
    while(tem < sl->size)
    {
        sl->arr[tem - 1] = sl->arr[tem];
        tem++;
    }
    sl->size--;
    return 1;
}

void TraverseList(SL* sl)
{
    for(int i = 0; i < sl->size; i++)
        if(i == sl->size - 1)
            printf("%d", sl->arr[i]);
        else
            printf("%d-->", sl->arr[i]);
    if(sl->size == 0)
    printf("emppty");
    printf("\n");
}

int main()
{
SL sl1;
InitList(&sl1);

TraverseList(&sl1);

//插入元素
ListInsert(&sl1, 1, 11);
ListInsert(&sl1, 2, 45);
ListInsert(&sl1, 3, 14);
TraverseList(&sl1);

ClearList(&sl1);
TraverseList(&sl1);

ListInsert(&sl1, 1, 11);
ListInsert(&sl1, 2, 45);
ListInsert(&sl1, 3, 14);

elemtype nex = 0, pre = 0, tem;
GetElem(&sl1, 2, &tem);
NextElem(&sl1, tem, &nex);
PriorElem(&sl1, tem, &pre);
printf("%d and %d\n", pre, nex);

ListDelete(&sl1, 2);
TraverseList(&sl1);
    return 0;
}

